package top.i89ck.modules.admin;

import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.SecureUtil;
import com.jfinal.aop.Before;
import com.jfinal.aop.Clear;
import com.jfinal.aop.Inject;
import com.jfinal.core.Controller;
import com.jfinal.core.Path;
import org.opensource.jfhelper.annocation.View;
import org.opensource.jfhelper.interceptor.RestInterceptor;
import org.opensource.jfhelper.utils.Ret;
import top.i89ck.common.jqgrid.JqGridInterceptor;
import top.i89ck.modules.handler.GlobalInterceptor;
import top.i89ck.modules.handler.LoginInterceptor;
import top.i89ck.modules.model.Option;
import top.i89ck.modules.model.User;
import top.i89ck.modules.service.OptionService;
import top.i89ck.modules.service.UserService;
import top.i89ck.modules.utils.Const;
import top.i89ck.modules.utils.Subject;

import java.util.List;
import java.util.Objects;

/**
 * 后台管理系统登录首页
 *
 * @author Seiya
 */
@Path(value = "admin", viewPath = top.i89ck.common.utils.Const.BASE_PATH)
public class IndexController extends Controller {

    @Inject
    private OptionService optService;
    @Inject
    private UserService userService;

    /**
     * 打开系统登陆页， 系统默认访问的时候加载的登陆页
     */
    @Clear
    @Before(GlobalInterceptor.class)
    public void index() {
        User sessionUser = getSessionAttr(Const.SESSION_LOGIN_KEY);
        if (null != sessionUser) {
            redirect(getControllerPath() + "/system");
        } else {
            set("code", getParaToInt("code")).set("url", "admin");
            render("login.html");
        }
    }

    /**
     * 进入系统界面，进行系统界面操作
     */
    public void system() {
        List<Option> options = null;
        List<Option> topmsgs = null;
        User sessionUser = Subject.getSessionUser();
        switch (sessionUser.getType()) {
            // 其他管理员需要做限制
            case Const.USER_TYPE_DEFAULT:
                options = optService.getLeftMenuByRoleId(sessionUser.getRoleId());
                topmsgs = optService.getTopMsgByRoleId(sessionUser.getRoleId());
                set("user", sessionUser);
                break;
            // 超级管理员不做任何限制
            case Const.USER_TYPE_SUPER:
                options = optService.getLeftMenu();
                topmsgs = optService.getTopMsg();
                break;
            default:
                break;
        }
        set("options", options);
        set("topmsgs", topmsgs);
        render("index/index.html");
    }

    /**
     * 进入系统的Home首页
     */
    public void home() {
        render("home/home.html");
    }

    /**
     * 退出登陆，清除换存
     */
    @Clear
    @Before(GlobalInterceptor.class)
    public void outer() {
        removeSessionAttr(Const.SESSION_LOGIN_KEY);
        Subject.remove();
        renderJson(Ret.ok());
    }

    /**
     * 验证用户的账号密码， 验证通过后进行登陆操作
     */
    @Clear({LoginInterceptor.class, JqGridInterceptor.class})
    public Ret validLogin(String loginName, String loginPassword) {
        User user = userService.getCheckLogin(loginName, loginPassword);
        if (null != user) {
            setSessionAttr(Const.SESSION_LOGIN_KEY, user);
            return Ret.ok().setData("admin/system");
        } else {
            return Ret.fail("用户名或密码错误");
        }
    }

    /**
     * 当前用户修改密码的功能界面
     */
    public void changePwd() {
        render("index/update_pwd.html");
    }

    /**
     * 当前用户修改密码的操作行为
     */
    public Ret updatePwd(String nPwd, String oPwd, String cPwd) {
        User sessionUser = Subject.getSessionUser();
        if (!StrUtil.equals(nPwd, cPwd)) {
            return Ret.fail("两遍新密码不一致");
        }
        if (StrUtil.equals(oPwd, nPwd)) {
            return Ret.fail("新密码不能和老密码一样");
        }
        if (!StrUtil.equals(SecureUtil.md5(oPwd).toUpperCase(), sessionUser.getLoginPassword())) {
            return Ret.fail("旧密码不正确");
        }
        boolean succeed = userService.updatePwd(nPwd, sessionUser);
        return succeed ? Ret.ok() : Ret.fail("修改密码失败，请重新操作");
    }
}
